/**
 * 原地删除所有数值为val的元素并返回新数组的长度
 * @param {number[]} nums 
 * @param {number} val 
 * 双指针
 */
var removeElement = function (nums, val) {
    if (nums.length === 0) {
        return 0
    }
    // 左指针l找为val的数，右指针r找不为val的数，交换；直到l=r
    let l = 0, r = nums.length - 1
    while (l < r) {
        while (l < r && nums[l] !== val) {
            l++
        }
        while (l < r && nums[r] === val) {
            r--
        }
        [nums[l], nums[r]] = [nums[r], nums[l]]
    }
    
    return nums[l] === val ? l : l + 1
}

var removeElement2 = function (nums, val) {
    // filter 不会对空数组进行检测、不会改变原始数组
    return nums.filter(v => v !== val).length
}